/*
 * Emini Physics Engine Demo source 
 * by Alexander Adensamer
 * 
 * Copyright (c) 2010, Emini Physics - Alexander Adensamer
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or 
 * without modification, are permitted provided that the following 
 * conditions are met:
 * 
 *  * Redistributions of source code must retain the above 
 *    copyright notice, this list of conditions and the 
 *    following disclaimer.
 *  * Redistributions in binary form must reproduce the above 
 *    copyright notice, this list of conditions and the following 
 *    disclaimer in the documentation and/or other materials provided 
 *    with the distribution.
 *  * Neither the name of the Emini Physics nor the names of 
 *    its contributors may be used to endorse or promote products 
 *    derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 * OF SUCH DAMAGE.
 */

package com.myapp.balltest.ballView;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import at.emini.physics2D.World;
import at.emini.physics2D.util.PhysicsFileReader;
import com.myapp.balltest.ballView.R;
import com.myapp.balltest.graphics.GraphicsWorld;
import com.myapp.balltest.graphics.SimulationView;
import com.myapp.balltest.graphics.UserImages;

public class PhysEngineAndroidSample extends Activity 
{
    
    private Handler handler;
    
    private GraphicsWorld world;
    private SimulationView simulationView;
    
    private SensorManager mSensorManager;
   
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
     
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        
        handler = new Handler();       
        
        UserImages.initBitmaps(getResources());
        createWorld();
        
        simulationView = new SampleSimulationView(this, world);
        simulationView.setKeepScreenOn(true);
                
        //set background image as rgb565 to render the background faster and save memory
        BitmapFactory.Options options = new BitmapFactory.Options();    
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        simulationView.setBackground(BitmapFactory.decodeResource(getResources(), R.drawable.background, options)); //Background
                
        setContentView(simulationView);        
    }    
   
    
    @Override
    protected void onPause() 
    {
        super.onPause();
        handler.removeCallbacks(update);
        mSensorManager.unregisterListener(world);
    }
    
    @Override
    protected void onResume() 
    {
        super.onResume();
        handler.post(update);
        if (world != null)
        {
            mSensorManager.registerListener(world, 
                    SensorManager.SENSOR_ACCELEROMETER,
                    SensorManager.SENSOR_DELAY_GAME);
        }
        
    }
   
    public GraphicsWorld createWorld()
    {                
        PhysicsFileReader reader = new PhysicsFileReader(getResources().openRawResource(R.raw.world));
        world = new GraphicsWorld( World.loadWorld(reader, new UserImages()) );
                
        world.setDrawLandscape(false);
        
        mSensorManager.registerListener(world, 
                SensorManager.SENSOR_ACCELEROMETER,
                SensorManager.SENSOR_DELAY_GAME);
        
        return world;
    }

    public void resetWorld()
    {
        handler.removeCallbacks(update);
        mSensorManager.unregisterListener(world);

        createWorld();

    	simulationView = new SampleSimulationView(this, world);
        simulationView.setKeepScreenOn(true);
                
        //set background image as rgb565 to render the background faster and save memory
        BitmapFactory.Options options = new BitmapFactory.Options();    
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        simulationView.setBackground(BitmapFactory.decodeResource(getResources(), R.drawable.background, options)); //Background
                
        setContentView(simulationView);
        
        handler.post(update);
        if (world != null)
        {
            mSensorManager.registerListener(world, 
                    SensorManager.SENSOR_ACCELEROMETER,
                    SensorManager.SENSOR_DELAY_GAME);
        }

    }
       
    private Runnable update = new Runnable() 
    {
        public void run() 
        {            
            long start = System.currentTimeMillis();
            simulationView.tickWorld();
            long end = System.currentTimeMillis();
            handler.postDelayed(update, (long) Math.max( 50 - (end - start), 0));
        }
    };
}